package com.example.senior_homework.repository


import com.example.senior_homework.entity.Senior
import com.example.senior_homework.repository.api.SeniorUploadApi
import com.example.senior_homework.repository.dao.SeniorDao

import com.example.senior_homework.utils.localDateToDate
import dagger.hilt.android.scopes.ViewScoped

import retrofit2.Response
import java.time.LocalDate
import javax.inject.Inject

//这个inject注解用在构造方法上，一是可以注入其它参数，二是自己本身也会变成可注入对象
//这个注解是限制使用范围的，安全点点
//@ViewScoped，算了这个注解属于进阶操作了
class MyRepository @Inject constructor() {

/*
* 依赖注入
* */

//    注意lateinit的延迟注入哦，不然要么就写在构造方法中
//    构造器注入，延迟注入，方法参数注入这三种方式都可以，一般推荐第一种
//    注入的属性不能写私有
    @Inject
    lateinit var _dao:SeniorDao

    @Inject
    lateinit var  _api:SeniorUploadApi


/*
* 数据库基本接口
* */

    suspend fun loadDatas(currenDay:LocalDate): List<Senior> {
        return _dao.findByDate(localDateToDate(currenDay))
    }

    suspend fun deleteDataById(id:Int){
        _dao.deleteById(id)
    }

    suspend fun insertSenior(senior: Senior){
        _dao.insertSenior(senior)
    }



    suspend fun getDetailById(id: Int): Senior? {
        return _dao.findById(id)
    }

    suspend fun updateSenior(showDetailData:Senior){
        _dao.updateSenior(showDetailData)
    }

    suspend fun findNoUploadedDatas(): List<Senior> {
        return _dao.findNoUploaded()
    }

/*
* 网络层基本接口
* */

    suspend fun postSeniorDatas(noUploadedDatas:List<Senior>): Response<String> {
        return _api.postDatas(noUploadedDatas)
    }
}

//如果 _dao.value.updateSenior 是一个普通的同步函数或是一个阻塞调用，那么 updateSenior 函数上的 suspend 修饰符就是多余的